문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 CPU 게이트 (문단 편집) ===== 전공자를 위한 보다 더 기술적인 설명 ===== 기술적으로 완벽한 설명을 하기 위해서는 시스템의 비트 상황이나 캐시구조 등 하드웨어의 세부사항까지 이해해야 한다. 다만 진짜 자세히 설명한다면 문서 하나로는 다 끝나지 않을 정도로 방대한 내용이 되므로 여기에서는 대략적인 개요만을 설명한다. 캐시와 타입캐스팅을 어떻게 활용하는지 확인하는 용도로 사용하면 적절하며 그 이상으로 정확하지는 않다. 이 설명은 OS와 메모리 구조, CPU 파이프라인에 대한 전공지식이 있다는 것을 전제로 한다. 공격 프로그램은 커널의 특정 메모리 주소를 읽기 위해 다음의 변수 및 배열을 설정한다. 1. ka: 값을 읽어올 커널의 메모리 주소. 2. ua1: L1 캐시 크기 만큼의 배열 3. ua2: 256 크기 만큼의 배열.[* 실제로는 캐시가 RAM에서 정보를 한 번에 가져오는 단위인 캐시라인을 고려해야 한다. 여기에서는 설명을 위해 단순화 시켰다.] 코드의 실행순서는 다음과 같다. A. ka에 원하는 주소를 세팅한다. B. ua1의 모든 값을 읽는다. C. ka의 값을 읽어서 레지스터 al에 저장한다. D. ua2[al]의 값을 읽는다. E. 아무 것도 하지 않는 명령어를 적당히 깔아둔다. F. ua2에서 캐시로 값이 들어온 주소를 알아낸다. 위 코드의 실행 순서를 바탕으로 자세한 동작 원리는 다음과 같다. 첫째. B에서 ua1의 값을 모두 읽었기에, L1 캐시는 ua1의 정보로 가득 차 있다. 따라서 이 시점에서 ua2의 정보는 캐시에 없다는 것이 보장된다. 둘째. C는 항상 실행이 취소된다. 사용자 프로세스가 커널 정보를 읽는 것이기 때문에 보호비트가 발동된다. 셋째. C가 실행이 취소되기 전, C, D는 파이프라인의 execute state를 지난다. 즉, '''CPU는 ua2[al]의 값을 읽는다. 단지 commit 하지 않을 뿐이다.'''[* C가 실행되지 않았는데 D가 실행될 수 있는 이유는 파이프라인 구조에서 성능향상을 위해 실행이 완료되지 않은 명령어의 정보를 다른 명령어에게 전달할 수 있기 때문이다.] 넷째. 컴퓨터에서 array에 접근할 때에는 보통 간접적인 방식으로 접근한다. C언어에서 tmp_arr[10]이라고 적는 경우를 생각해 보자. 실제로는 tmp_arr이 가리키는 주소에서 10을 더하는 방식으로 주소를 계산한다. ua2[al]을 읽을 때에도 마찬가지로 계산한다. 다섯째. D는 execute state를 지났으므로, CPU는 실제로 ua2[al]을 읽는다. 따라서 이 값이 ua2 배열 중 유일하게 캐시에 올라와 있다. al이 97 즉, 'a'라면 ua2[97]만 캐시에 올라와 있고 나머지는 캐시에 없다. 여섯째. F단계에서 해커는 ua2[0]~ua2[255]까지를 랜덤한 순서로 전부 읽어본다. 읽을 때마다 읽기 시간을 측정한다. 다른 모든 값은 캐시에 없으니 읽는 데 시간이 걸리지만, ua2[97]은 캐시에 올라와 있으니 읽기 시간이 빠르다. 이를 근거로 ka값이 가리키는 주소에 97이 들어있다는 것을 알 수 있다.[* CPU클락 카운터 등 정밀한 시계를 사용한다. 읽기는 무작위로 해야 한다. 순서대로 읽을 경우 CPU에서 이를 예측하고 ua2의 일부 내용을 캐시에 미리 올릴 수 있다.] 일곱째. E에서 아무 것도 하지 않는 명령어를 적당히 깔아두는 이유는 F가 실행취소되거나 재시도 되는 것을 막기 위한 의도적인 파이프라인 버블이다. 결국 핵심은 조건 분기나 예외 발생 등의 명령어를 처리할 때 파이프라인의 실행 단계에 가야 그 다음에 들어올 명령어가 틀렸는지 알 수 있다는 파이프라인 구조의 단점을 메우기 위한 대책들이 메모리 계층 등 CPU 연산 자체와 직접 상관 없는 부분에 흔적을 남긴다는 것이다. 멜트다운-스펙터 취약점 이후 추가로 발견된 취약점들도 일부 예외를 제외하면 이런 유형에 해당한다. [[하이퍼스레딩]]이 문제가 되는 것도 두 개의 논리 스레드가 하나의 물리 코어를 공유하기 때문에 한 스레드의 연산 결과를 코어를 공유 중인 다른 논리 스레드가 훔쳐볼 수 있다는 것에 기인한다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기